import Foundation


/**
    B站：https://www.bilibili.com/video/BV1gJ411M72p

    第51课 不透明结果类型
 */

protocol Person {
    // 关联类型 associatedtype
    associatedtype TypeTest
    var info: TypeTest{set get}
}

// 可切换方便 被注释掉了
class Teacher: Person {
    var info: Int
    
    init(info: Int) {
        self.info = info
    }
}

// 可切换方便 被注释掉了
//class Teacher: Person {
//    typealias TypeTest = Int
//    var info: TypeTest
//    
//    init(info: TypeTest) {
//        self.info = info
//    }
//}

// 可切换方便 被注释掉了
class Student: Person {
    var info: String
    
    init(info: String) {
        self.info = info
    }
}

// 可切换方便 被注释掉了
//class Student: Person {
//    typealias TypeTest = String
//    var info: TypeTest
//
//    init(info: TypeTest) {
//        self.info = info
//    }
//}


func getObject() -> some Person {
    return Student(info: "xiaoming")
//    return Teacher<Int>.init(info: 10) // 可切换方便 被注释掉了
//    return Teacher<Int>(info: 10) // 可切换方便 被注释掉了
}

let value = getObject()
print(value.info)


print("\n\n")


// -------------


protocol Animal {
    associatedtype AnimalType
    var info: AnimalType{set get}
}

class Dog<T>: Animal {
    typealias AnimalType = T
    var info: T
    init(info: T) {
        self.info = info
    }
}

// 忘记了， 看 第36课
func getAnimalObj<T>(params: T) -> some Animal {
    return Dog<T>.init(info: params)
}

// String
//let aniValue = getAnimalObj(params: "hello") // 可切换方便 被注释掉了
// Int
//let aniValue = getAnimalObj(params: 10) // 可切换方便 被注释掉了
// 元组
let aniValue = getAnimalObj(params: ("srxboys", 10, "GitHub、Gitee")) // 可切换方便 被注释掉了
print("animal value=>", aniValue.info)
